package visu;

import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JComponent;

/**
 * Un Visualisateur est un composant graphique permettant de représenter
 * visuellement un {@link Champ}.
 * 
 * @author COLLET Philippe
 * @author gnpt
 */
public class Visualisateur extends JComponent implements Champ {
	private static final long serialVersionUID = 1L;
	// La liste des entités dessinables
	protected List<? extends Dessinable> dessinables;
	// La largeur du composant graphique en pixels
	protected int largeur;
	// La hauteur du composant graphique en pixels
	protected int hauteur;

	/**
	 * Constructeur.
	 * 
	 * @param largeur
	 *            la largeur du visualisateur en pixels.
	 * @param hauteur
	 *            la hauteur du visualisateur en pixels.
	 * @param ld
	 *            la liste des entités dessinables.
	 */
	public Visualisateur(int largeur, int hauteur, List<? extends Dessinable> ld) {
		super.setBorder(BorderFactory.createLoweredBevelBorder());
		Dimension frameSize = new Dimension(largeur, hauteur);
		super.setPreferredSize(frameSize);
		super.setMinimumSize(frameSize);
		this.largeur = largeur;
		this.hauteur = hauteur;
		this.dessinables = ld;
	}

	/**
	 * Constructeur permettant de créer un visualisateur de taille
	 * <code>largeur</code>x<code>hauteur</code> pixels.
	 * 
	 * @param largeur
	 *            la largeur du visualisateur en pixels.
	 * @param hauteur
	 *            la hauteur du visualisateur en pixels.
	 */
	public Visualisateur(int largeur, int hauteur) {
		this(largeur, hauteur, new ArrayList<Dessinable>(0));
	}

	/**
	 * Crée un visualisateur par défaut de taille 640x480 pixels.
	 */
	public Visualisateur() {
		this(640, 480);
	}

	/**
	 * @see visu.Champ#getHauteur()
	 */
	@Override
	public int getHauteur() {
		return this.hauteur;
	}

	/**
	 * @see visu.Champ#getLargeur()
	 */
	@Override
	public int getLargeur() {
		return this.largeur;
	}

	/**
	 * @see visu.Champ#getPositionnables()
	 */
	@Override
	public List<? extends Positionnable> getPositionnables() {
		return this.dessinables;
	}

	/**
	 * @see javax.swing.JComponent#paint(java.awt.Graphics)
	 */
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		synchronized (this.dessinables) {
			for (Dessinable d : this.dessinables) {
				d.seDessine(g);
			}
		}
	}

	/**
	 * Mutateur pour les entités dessinables.
	 * 
	 * @param dessinables
	 *            la liste des nouvelles entités dessinables.
	 */
	public void setDessinables(List<? extends Dessinable> dessinables) {
		this.dessinables = dessinables;
	}
}
